
package com.study.manage.utils;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;

/**
 * 日期关联的工具类
 * 
 * @version 1.0 2017/9/5
 */
public class CmnDateUtil {

    /** 秒：00 */
    public static final String DEFAULT_SEC = "00";

    /** 时间：000000 */
    public static final String DEFAULT_TIME = "000000";

    /** 时间：235959 */
    public static final String DEFAULT_TIMETO = "235959";

    /** 时间：59 */
    public static final String DEFAULT_SEC_TO = "59";

    /** 1000毫秒 */
    public static final long ONE_MINUTE_MILER = 1000L;

    /** 60秒 */
    public static final long ONE_SECONDER_MINUTE = 60L;

    /** 60分 */
    public static final long ONE_HOUR_SECONDER = 60L;

    /** 24时 */
    public static final long ONE_DAY_HOUR = 24L;

    /** 1年 */
    public static final long ONE_YEAR_DAY = 365L;

    /** 日期格式：yyyyMM */
    public static final String DEFAULT_YEAR_MONTH = "yyyyMM";

    /** 日期格式：yyyyMMdd */
    public static final String DEFAULT_FORMAT = "yyyyMMdd";

    /** 日期格式：yyyyMMddHH */
    public static final String DEFAULT_HOUR_FORMAT = "yyyyMMddHH";
    
    /** 日期格式：yyyyMMddHHmm */
    public static final String DEFAULT_PRETTY_HOUR_MINUTE = "yyyyMMddHHmm";
    
    /** 日期格式：yyyyMMddHHmmss */
    public static final String DEFAULT_PRETTY_HOUR_MINUTE_SEC = "yyyyMMddHHmmss";
    
    /** 日期格式：yyyyMMddHHmmss */
    public static final String DEFAULT_PRETTY_HOUR_MINUTE_MILLSEC_FORMAT = "yyyyMMddHHmmss";

    /** 日期格式：yyyyMMddHHmmssSSS */
    public static final String DEFAULT_PRETTY_HOUR_MILLSEC_FORMAT = "yyyyMMddHHmmssSSS";

    /** 日期格式：yyyy/MM */
    public static final String DEFAULT_PRETTY_YEAR_MONTH = "yyyy/MM";
    
    /** 日期格式：yyyy/MM/dd */
    public static final String DEFAULT_PRETTY_FORMAT = "yyyy/MM/dd";

    /** 日期格式：yyyy/MM/dd HH */
    public static final String DEFAULT_PRETTY_HOUR_FORMAT = "yyyy/MM/dd HH";

    /** 日期格式：yyyy/MM/dd HH:mm */
    public static final String DEFAULT_PRETTY_HOUR_MINUTE_FORMAT = "yyyy/MM/dd HH:mm";
    
    /** 日期格式：yyyy/MM/dd HH:mm:ss */
    public static final String PRETTY_HOUR_MINUTE_MILLSEC_FORMAT = "yyyy/MM/dd HH:mm:ss";

    /** 日期格式：HH:mm */
    public static final String DEFAULT_HOUR_MINUTE_FORMAT = "HH:mm";
    
    /** 日期格式：HHmm */
    public static final String JUST_HOUR_MINUTE_FORMAT = "HHmm";
    
    /** 日期格式：HHmmss */
    public static final String JUST_TIME_FORMAT = "HHmmss";

    /** 日期格式 yyyy-MM-dd HH:mm:ss */
    public static final String DATE_PATTERN_LONG = "yyyy-MM-dd HH:mm:ss";

    /** 日期格式：yyyy.MM.dd */
    public static final String DATE_DOT_FORMAT = "yyyy.MM.dd";

    /** 日期格式：yyyy 年 M 月 d 日 */
    public static final String CHINESE_SIMPLE_FORMAT = "yyyy 年 M 月 d 日";

    /** 日期计算使用的默认值 */
    private static final int DEFAULT_AMOUNT = 1;

    /**
     * 日期时间的默认格式转换。
     *
     * @param target 日期文字列
     * @return "yyyy/MM/dd HH:mm:ss"形式
     */
    public static String formatDBdateTime(String target) {

        if (CmnStringUtils.isBlank(target)){
            return CmnStringUtils.EMPTY;
        }
        SimpleDateFormat dbSdf = new SimpleDateFormat(
            DEFAULT_PRETTY_HOUR_MINUTE_MILLSEC_FORMAT);
        SimpleDateFormat pageSdf = new SimpleDateFormat(
            PRETTY_HOUR_MINUTE_MILLSEC_FORMAT);
        try{
            Date d = dbSdf.parse(target);
            return pageSdf.format(d);
        }catch (ParseException e){
            return CmnStringUtils.EMPTY;
        }
    }

    /**
     * 17位日期时间的默认格式转换。
     *
     * @param target 日期文字列
     * @return "yyyy/MM/dd HH:mm:ss"形式
     */
    public static String formatDBdateTime17(String target) {

        if (CmnStringUtils.isBlank(target)){
            return CmnStringUtils.EMPTY;
        }
        SimpleDateFormat dbSdf = new SimpleDateFormat(
            DEFAULT_PRETTY_HOUR_MILLSEC_FORMAT);
        SimpleDateFormat pageSdf = new SimpleDateFormat(
            PRETTY_HOUR_MINUTE_MILLSEC_FORMAT);
        try{
            Date d = dbSdf.parse(target);
            return pageSdf.format(d);
        }catch (ParseException e){
            return CmnStringUtils.EMPTY;
        }
    }

    /**
     * 日期的默认格式转换。
     *
     * @param target 日期文字列
     * @return "yyyy/MM/dd"形式
     */
    public static String formatDBdate(String target) {

        if (CmnStringUtils.isBlank(target)){
            return CmnStringUtils.EMPTY;
        }
        SimpleDateFormat dbSdf = new SimpleDateFormat(DEFAULT_PRETTY_HOUR_MINUTE_MILLSEC_FORMAT);
        SimpleDateFormat pageSdf = new SimpleDateFormat(DEFAULT_PRETTY_FORMAT);
        try{
            Date d = dbSdf.parse(target);
            return pageSdf.format(d);
        }catch (ParseException e){
            return CmnStringUtils.EMPTY;
        }
    }

    /**
     * 日期格式转换（带中文）
     *
     * @param target "yyyyMMdd"形式
     * @return "yyyy 年 M 月 d 日"形式
     */
    public static String formatDBdateToCnSimple(String target) {

        if (CmnStringUtils.isBlank(target)){
            return CmnStringUtils.EMPTY;
        }
        SimpleDateFormat dbSdf = new SimpleDateFormat(DEFAULT_FORMAT);
        SimpleDateFormat pageSdf = new SimpleDateFormat(CHINESE_SIMPLE_FORMAT);
        try{
            Date d = dbSdf.parse(target);
            return pageSdf.format(d);
        }catch (ParseException e){
            return CmnStringUtils.EMPTY;
        }
    }

    /**
     * 日期格式转换
     *
     * @param target "yyyyMMdd"形式
     * @return "yyyy.MM.dd"形式
     */
    public static String formatDBdateDot(String target) {

        if (CmnStringUtils.isBlank(target)){
            return CmnStringUtils.EMPTY;
        }
        SimpleDateFormat dbSdf = new SimpleDateFormat(DEFAULT_FORMAT);
        SimpleDateFormat pageSdf = new SimpleDateFormat(DATE_DOT_FORMAT);
        try{
            Date d = dbSdf.parse(target);
            return pageSdf.format(d);
        }catch (ParseException e){
            return CmnStringUtils.EMPTY;
        }
    }

    /**
     * 日期的默认格式转换。
     *
     * @param target 日期文字列
     * @return "yyyyMMdd"形式
     */
    public static String formatFormdate(String target) {

        if (target == null){
            return target;
        }
        return target.replaceAll("/", "");
    }

    /**
     * 时间的默认格式转换。
     *
     * @param target 时间文字列
     * @return "HHmm"形式
     */
    public static String formatFormTime(String target) {

        if (target == null){
            return target;
        }
        return target.replaceAll(":", "");
    }

    /**
     * 日期的默认格式转换。
     *
     * @param target 日期文字列
     * @return "yyyyMMdd"形式
     */
    public static String convertDefaultFormat(String target) {

        return convert(target, ArrayUtils.toArray(DEFAULT_FORMAT,
            DEFAULT_HOUR_FORMAT, DEFAULT_PRETTY_FORMAT,
            DEFAULT_PRETTY_HOUR_FORMAT,
            DEFAULT_PRETTY_HOUR_MINUTE_MILLSEC_FORMAT), false);
    }

    /**
     * 日期的yyyy/MM/dd格式转换。
     *
     * @param target 日期文字列
     * @return "yyyy/MM/dd"形式
     */
    public static String convertDefaultPrettyFormat(String target) {

        return convert(target, ArrayUtils.toArray(DEFAULT_FORMAT,
            DEFAULT_HOUR_FORMAT, DEFAULT_PRETTY_FORMAT,
            DEFAULT_PRETTY_HOUR_FORMAT,
            DEFAULT_PRETTY_HOUR_MINUTE_MILLSEC_FORMAT), true);
    }

    public static String formatDate(String target) {

    	if (StringUtils.isEmpty(target)){
            return null;
        }
    	String str = target.substring(0, 10).replace("-",".");
        return str;
    }
    
    /**
     *
     * 日期形式默认形式变化
     *
     * @param target 变换对象
     * @param fromPatterns 变化前形式
     * @param pretty false："yyyyMMdd形式变换。true："yyyy/MM/dd"形式变换
     * @return 默认形式的日期文字
     */
    public static String convert(String target, String[] fromPatterns,
        boolean pretty) {

        if (StringUtils.isEmpty(target)){
            return null;
        }
        try{
            String toPattern = null;
            Date d = DateUtils.parseDateStrictly(target, fromPatterns);
            if (target.indexOf("/") > 0){
                if (DEFAULT_PRETTY_FORMAT.length() == target.length()){
                    toPattern = pretty ? DEFAULT_PRETTY_FORMAT : DEFAULT_FORMAT;
                }else{
                    toPattern = pretty ? DEFAULT_PRETTY_HOUR_FORMAT
                        : DEFAULT_HOUR_FORMAT;
                }
            }else{
                if (DEFAULT_FORMAT.length() == target.length()){
                    toPattern = pretty ? DEFAULT_PRETTY_FORMAT : DEFAULT_FORMAT;
                }else if (DEFAULT_PRETTY_HOUR_MINUTE_MILLSEC_FORMAT.length() == target
                    .length()){
                    toPattern = pretty ? DEFAULT_PRETTY_HOUR_MINUTE_FORMAT
                        : DEFAULT_PRETTY_HOUR_MINUTE;
                }else{
                    toPattern = pretty ? DEFAULT_PRETTY_HOUR_FORMAT
                        : DEFAULT_HOUR_FORMAT;
                }
            }
            SimpleDateFormat sdf = new SimpleDateFormat(toPattern);
            return sdf.format(d);
        }catch (ParseException e){
            throw new IllegalArgumentException(e);
        }

    }

    /**
     * 是否是将来日期的判断
     *
     * @param target 判定対象
     * @return true:将来日期 false:不是
     */
    public static boolean isFuture(String target) {

        try{
            Date d = DateUtils.parseDateStrictly(target, DEFAULT_FORMAT,
                DEFAULT_PRETTY_FORMAT);
            Date now = new Date();
            if (now.compareTo(d) > 0){
                return false;
            }
            return true;
        }catch (ParseException e){
            throw new IllegalArgumentException(e);
        }
    }

    /**
     * 取得当前年
     *
     * @return 当前年
     */
    public static String getNowYear() {

        Date d = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
        return sdf.format(d);
    }

    /**
     * 当前日期 格式："yyyyMMdd"
     *
     * @return 当前日期
     */
    public static String getNowYYYYMMDD() {

        Date d = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        return sdf.format(d);
    }
    
    /**
     * 当前日期 格式："yyyyMM"
     *
     * @return 当前年月
     */
    public static String getNowYYYYMM() {

        Date d = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
        return sdf.format(d);
    }

    /**
     * 当前日期 格式："YYYYMMDDHHMM"
     *
     * @return 当前日期
     */
    public static String getNowYYYYMMDDHHMM() {

        Date d = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_PRETTY_HOUR_MINUTE);
        return sdf.format(d);
    }
    
    /**
     * 当前日期 格式："yyyy-MM-dd HH:mm:ss"
     *
     * @return 当前日期
     */
    public static String getNowTime() {

        Date d = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN_LONG);
        return sdf.format(d);
    }

    /**
     * 当前日期 格式："yyyyMMddHHmmss"
     *
     * @return 当前日期
     */
    public static String getNowYYYYMMDDHHMMSS() {

        return formatYYYYMMDDHHMMSS(new Date());
    }

    /**
     * 当前日期 格式："yyyyMM"
     *
     * @param year 年份
     * @param month 月份
     * @return 当前日期
     */
    public static String getYearMonth(int year, int month) {

        Date d = new Date();
        DateUtils.setYears(d, year);
        DateUtils.setMonths(d, month);
        DateUtils.setDays(d, 1);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
        return sdf.format(d);
    }

    /**
     * 当前日期 格式："YYYYMMDDHHMMssSSS"
     *
     * @return 当前日期
     */
    public static String getNowYYYYMMDDHHMMssSSS() {

        Date d = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat(
            DEFAULT_PRETTY_HOUR_MILLSEC_FORMAT);
        return sdf.format(d);
    }

    /**
     * 当前日期 格式："YYYYMMDDHHMMssSSS"
     *
     * @return 当前日期
     */
    public static String getNowHHMM() {

        Date d = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat(JUST_HOUR_MINUTE_FORMAT);
        return sdf.format(d);
    }

    /**
     * 转换格式："yyyyMMddHHmmss"为日期对象
     *
     * @param source 转换文字列
     * @return 日期对象
     */
    public static Date parseDate(String source) {

        if (CmnStringUtils.isEmpty(source)){
            return null;
        }
        String orig = source;
        source = source.replaceAll("/", "");
        source = source.replaceAll(":", "");
        source = source.replaceAll(" ", "");
        int strLen = source.length();

        String format = null;
        switch (strLen) {
            case 4:
                format = JUST_HOUR_MINUTE_FORMAT;
                break;
            case 6:
                if (orig.indexOf("/") == 4) {
                    format = DEFAULT_YEAR_MONTH;
                } else {
                    format = JUST_TIME_FORMAT;
                }
                break;
            case 8:
                format = DEFAULT_FORMAT;
                break;
            case 10:
                format = DEFAULT_HOUR_FORMAT;
                break;
            case 12:
                format = DEFAULT_PRETTY_HOUR_MINUTE_MILLSEC_FORMAT;
                break;
            case 14:
                format = DEFAULT_PRETTY_HOUR_MINUTE_MILLSEC_FORMAT;
            case 17:
                format = DEFAULT_PRETTY_HOUR_MILLSEC_FORMAT;
            default:
                format = DEFAULT_PRETTY_HOUR_MINUTE_MILLSEC_FORMAT;

        }
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        try{
            return sdf.parse(source);
        }catch (ParseException e){
            throw new IllegalArgumentException(e);
        }
    }

    /**
     * 转换格式："yyyyMMddHH"为日期对象
     *
     * @param source 转换文字列
     * @return 日期对象
     */
    public static Date parseYYYYMMDDHH(String source) {

        SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_HOUR_FORMAT);
        try{
            return sdf.parse(source);
        }catch (ParseException e){
            throw new IllegalArgumentException(e);
        }
    }

    /**
     * 转换格式："yyyyMMdd"为日期对象
     *
     * @param source 转换文字列
     * @return 日期对象
     */
    public static Date parseYYYYMMDD(String source) {

        SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_FORMAT);
        try{
            return sdf.parse(source);
        }catch (ParseException e){
            throw new IllegalArgumentException(e);
        }
    }

    public static Date parseDate(String source, String... formats) {
        if (StringUtils.isEmpty(source)) return null;
        try {
            return DateUtils.parseDate(source, formats);
        } catch (ParseException e) {
            throw new IllegalArgumentException(e);
        }
    }

    /**
     * 转换格式："yyyyMMdd"的文字列
     *
     * @param source 日期对象
     * @return 转换后文字列
     */
    public static String formatYYYYMMDDHHMMSS(Date source) {

        SimpleDateFormat sdf = new SimpleDateFormat(
            DEFAULT_PRETTY_HOUR_MINUTE_MILLSEC_FORMAT);
        return sdf.format(source);
    }

    /**
     * 转换格式："YYYYMMDD"的文字列
     *
     * @param source 日期对象
     * @return 转换后文字列
     */
    public static String formatYYYYMMDD(Date source) {

        SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_FORMAT);
        return sdf.format(source);
    }

    /**
     * 取得"HH:mm"
     *
     * @param target 日期对象文字列
     * @return "HH:mm"形式
     */
    public static String getHrMin(String target) {

        Date date = parseDate(target);
        SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_HOUR_MINUTE_FORMAT);
        return sdf.format(date);
    }

    /**
     * 取出数据库中的4位数，转换成hh：mm
     *
     * @param target
     * @return
     */
    public static String getHrMin1(String target) {

        if (CmnStringUtils.isBlank(target)){
            return null;
        }

        if (target.length() < 4){
            return null;
        }

        String HH = target.substring(0, 2);
        String mm = (String) target.substring(2, 4);
        String hhmm = HH + ":" + mm;
        return hhmm;
    }

    /**
     * 取出数据库中的14位数，转换成yyyy/mm/dd hh:mm
     *
     * @param target 日期文字列
     *
     * @return yyyy/mm/dd hh:mm格式文字列
     */
    public static String getDateHrMin(String target) {

        if (CmnStringUtils.isBlank(target)){
            return null;
        }
        Date date = parseDate(target);
        return format(date, DEFAULT_PRETTY_HOUR_MINUTE_FORMAT);

    }

    /**
     * 取得"HHmm"
     *
     * @param target 日期对象文字列
     * @return "HHmm"形式
     */
    public static String getJustHrMin(String target) {

        if (CmnStringUtils.isBlank(target)){
            return null;
        }
        Date date = parseDate(target);
        return format(date, JUST_HOUR_MINUTE_FORMAT);
    }

    /**
     * 取得"YYYYMMDD"
     *
     * @param target 日期对象文字列
     * @return "YYYYMMDD"形式
     */
    public static String getJustDate(String target) {

        if (CmnStringUtils.isBlank(target)){
            return null;
        }
        Date date = parseDate(target);
        return format(date, DEFAULT_FORMAT);
    }

    /**
     * 取得指定时间的几点钟
     *
     * @param target 日期对象文字列（YYYYMMDDHHMISS）
     * @return 几点钟
     */
    public static int getHour(String target) {

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(parseDate(target));
        return calendar.get(Calendar.HOUR_OF_DAY);
    }

    /**
     * 日期文字列格式化
     *
     * @param target 日期对象
     * @param formatPattern 格式化方式
     * @return 转换后文字列
     */
    public static String format(Date target, String formatPattern) {

        if (target == null){
            return CmnStringUtils.EMPTY;
        }

        return new SimpleDateFormat(formatPattern).format(target);
    }

    /**
     * 日期文字列格式化
     *
     * @param target 日期对象
     * @param formatPattern 格式化方式
     * @return 转换后文字列
     */
    public static String format(String target, String formatPattern) {

        if (target == null){
            return CmnStringUtils.EMPTY;
        }
        Date date = parseDate(target);
        return format(date, formatPattern);
    }

    /**
     * 日期文字列+1秒 "yyyyMMddHHmmss"形式
     *
     * @param target 日期文字列
     * @return "yyyyMMddHHmmss"形式
     */
    public static String getNextSecondYYYYMMDDHHMMSS(String target) {

        Calendar nowCalendar = Calendar.getInstance();

        nowCalendar.setTime(parseDate(target));

        nowCalendar.add(Calendar.SECOND, DEFAULT_AMOUNT);

        return formatYYYYMMDDHHMMSS(nowCalendar.getTime());
    }

    /**
     * 日期加减处理、返回"yyyyMMdd"形式
     *
     * @param calValue 计算值
     * @return "yyyyMMdd"形式
     */
    public static String getPrevMonthWithNowYYYYMMDD(int calValue) {

        Calendar nowCalendar = Calendar.getInstance();

        nowCalendar.setTime(getNowDate());
        nowCalendar.add(Calendar.MONTH, -calValue);

        return formatYYYYMMDD(nowCalendar.getTime());
    }

    /**
     * 前一天日期的取得、返回"yyyyMMdd"形式
     *
     * @param target 日期文字列
     * @return "yyyyMMdd"形式
     */
    public static String getPrevDayYYYYMMDD(String target) {

        Calendar nowCalendar = Calendar.getInstance();

        nowCalendar.setTime(parseYYYYMMDD(target));

        nowCalendar.add(Calendar.DATE, -DEFAULT_AMOUNT);

        return formatYYYYMMDD(nowCalendar.getTime());
    }

    /**
     * 前一天日期的取得、返回"yyyyMMdd"形式
     *
     * @param target 日期文字列
     * @return "yyyyMMdd"形式
     */
    public static String getNextMonthYYYYMMDD(String target) {

        return getNextMonthYYYYMMDD(target, DEFAULT_AMOUNT);
    }

    /**
     * 前一天日期的取得、"yyyyMMdd"形式
     *
     * @param target 日期文字列
     * @param months 几个月
     * @return "yyyyMMdd"形式
     */
    public static String getNextMonthYYYYMMDD(String target, int months) {

        Calendar nowCalendar = Calendar.getInstance();

        nowCalendar.setTime(parseYYYYMMDD(target));

        nowCalendar.add(Calendar.MONTH, months);

        return formatYYYYMMDD(nowCalendar.getTime());
    }

    /**
     * 日期加减处理、"yyyyMMdd"形式
     *
     * @param target 日期文字列
     * @param calValue 计算值
     * @return "yyyyMMdd"形式
     */
    public static String calDayYYYYMMDD(String target, int calValue) {

        Calendar nowCalendar = Calendar.getInstance();

        nowCalendar.setTime(parseYYYYMMDD(target));

        nowCalendar.add(Calendar.DATE, calValue);

        return formatYYYYMMDD(nowCalendar.getTime());
    }

    /**
     * 日期加减处理、"yyyyMMdd"形式
     *
     * @param target 日期文字列
     * @param calValue 计算值
     * @return "yyyyMMdd"形式
     */
    public static String calDayYYYYMMDDHHMMSS(String target, int calValue) {

        Calendar nowCalendar = Calendar.getInstance();

        nowCalendar.setTime(parseDate(target));

        nowCalendar.add(Calendar.DATE, calValue);

        return formatYYYYMMDDHHMMSS(nowCalendar.getTime());
    }

    /**
     * 取得指定格式的当前日期
     *
     * @param formatPattern 日期格式
     * @return 转换后日期
     */
    public static String getNowDate(String formatPattern) {

        return format(getNowDate(), formatPattern);
    }

    /**
     * 当前日期
     *
     * @return 当前日期
     */
    public static Date getNowDate() {

        Calendar cal = GregorianCalendar.getInstance();
        cal.setTimeInMillis(System.currentTimeMillis());
        return cal.getTime();
    }

    /**
     * 获取当前日期的时间差
     *
     * @param source 时间源
     * @return 时间差
     */
    public static long timeDifferenceWithNow(String source) {

        Date nowTime = getNowDate();
        if (CmnStringUtils.isBlank(source)){
            return nowTime.getTime();
        }
        DateFormat df = new SimpleDateFormat(
            DEFAULT_PRETTY_HOUR_MINUTE_MILLSEC_FORMAT);
        try{
            Date compareDateTime = df.parse(source);
            return nowTime.getTime() - compareDateTime.getTime();
        }catch (ParseException e){
            return nowTime.getTime();
        }
    }

    /**
     * 获取当前日期的时间差
     *
     * @param source 时间源
     * @return 时间差
     */
    public static long timeDifferenceDayWithNow(String source) {

        return numberToDay(timeDifferenceWithNow(source));
    }

    /**
     * 数字转为分钟
     *
     * @param source 时间源
     * @return 分钟
     */
    public static long numberToMinute(long source) {

        return source / (ONE_SECONDER_MINUTE * ONE_MINUTE_MILER);
    }

    /**
     * 数字转为小时
     *
     * @param source 时间源
     * @return 小时
     */
    public static long numberToHour(long source) {

        return source
            / (ONE_SECONDER_MINUTE * ONE_HOUR_SECONDER * ONE_MINUTE_MILER);
    }

    /**
     * 数字转为小时
     *
     * @param source 时间源
     * @return 小时
     */
    public static long numberToDay(long source) {

        return source
            / (ONE_DAY_HOUR * ONE_SECONDER_MINUTE * ONE_HOUR_SECONDER * ONE_MINUTE_MILER);
    }

    /**
     * 日期比较
     *
     * @param fromDate 开始日期
     * @param toDate 结束日期
     * @return from <= to ? true : false
     */
    public static boolean compareDate(String fromDate, String toDate) {

        return compareDate(fromDate, toDate, DEFAULT_FORMAT);
    }

    /**
     * 日期时间比较
     *
     * @param fromDate 开始日期
     * @param toDate 结束日期
     * @return from <= to ? true : false
     */
    public static boolean compareDateTime(String fromDate, String toDate) {

        return compareDate(fromDate, toDate, DEFAULT_PRETTY_HOUR_MINUTE);
    }

    /**
     * 日期时间比较(秒)
     *
     * @param fromDate 开始日期
     * @param toDate 结束日期
     * @return from <= to ? true : false
     */
    public static boolean compareDateTimeSec(String fromDate, String toDate) {

        return compareDateTime(fromDate, toDate, DEFAULT_PRETTY_HOUR_MINUTE_SEC);
    }

    /**
     * 日期比较(秒)
     *
     * @param oneDate 开始时间
     * @param otherDate 结束时间
     * @return OneDate >= OtherDate ? true : false
     */
    public static boolean compareTwoDateTime(String oneDate, String otherDate) {

        return compareTwoDateTime(oneDate, otherDate,
            DEFAULT_PRETTY_HOUR_MINUTE_SEC);
    }

    /**
     * 日期时间按
     *
     * @param fromTime 开始时间
     * @param toTime 结束时间
     * @return from <= to ? true : false
     */
    public static boolean compareTime(String fromTime, String toTime) {

        return compareDate(fromTime, toTime, JUST_HOUR_MINUTE_FORMAT);
    }

    /**
     * 日期比较
     *
     * @param fromDate 开始时间
     * @param toDate 结束时间
     * @param format 时间格式
     * @return from <= to ? true : false
     */
    public static boolean compareDate(String fromDate, String toDate,
        String format) {

        if (CmnStringUtils.isBlank(fromDate) || CmnStringUtils.isBlank(toDate)){
            return true;
        }
        DateFormat df = new SimpleDateFormat(format);
        try{
            Date from = df.parse(fromDate);
            Date to = df.parse(toDate);
            if (CmnNumberUtil.compareTo(to.getTime(), from.getTime()) > -1){
                return true;
            }
        }catch (ParseException e){
            return true;
        }
        return false;
    }

    /**
     * 日期比较
     *
     * @param fromDate 开始时间
     * @param toDate 结束时间
     * @param format 时间格式
     * @return from <= to ? true : false
     */
    public static boolean compareDateTime(String fromDate, String toDate,
        String format) {

        if (CmnStringUtils.isBlank(fromDate) || CmnStringUtils.isBlank(toDate)){
            return true;
        }
        DateFormat df = new SimpleDateFormat(format);
        try{
            Date from = df.parse(fromDate);
            Date to = df.parse(toDate);
            if (CmnNumberUtil.compareTo(to.getTime(), from.getTime()) > 0){
                return true;
            }
        }catch (ParseException e){
            return true;
        }
        return false;
    }

    /**
     * 日期比较
     *
     * @param oneDate 开始时间
     * @param otherDate 结束时间
     * @param format 时间格式
     * @return OneDate >= OtherDate ? true : false
     */
    public static boolean compareTwoDateTime(String oneDate, String otherDate,
        String format) {

        if (CmnStringUtils.isBlank(oneDate) || CmnStringUtils.isBlank(otherDate)){
            return true;
        }
        DateFormat df = new SimpleDateFormat(format);
        try{
            Date from = df.parse(oneDate);
            Date to = df.parse(otherDate);

            if (from.compareTo(to) >= 0){
                return true;
            }
        }catch (ParseException e){
            return true;
        }
        return false;
    }

    /**
     * 生成日期(yyyymmddhhmmss)
     *
     * @param date 日期
     * @param time 时间
     * @param isFromTime 开始时间还是结束时间
     * @return yyyymmddhhmmss
     */
    public static String convertDateTime(String date, String time,
        boolean isFromTime) {

        if (CmnStringUtils.isBlank(date) && CmnStringUtils.isBlank(time)){
            return null;
        }
        if (CmnStringUtils.isBlank(time)){
            String timeTmp = "";
            if (isFromTime){
                timeTmp = DEFAULT_TIME;
            }else{
                timeTmp = DEFAULT_TIMETO;
            }
            return date + timeTmp;
        }
        if (isFromTime){
            return date + time + DEFAULT_SEC;
        }
        return date + time + DEFAULT_SEC_TO;
    }

    /**
     * 生成日期from(yyyymmddhhmmss)
     *
     * @param date 日期from
     * @param time 时间from
     * @return yyyymmddhhmmss
     */
    public static String convertDateTimeFrom(String date, String time) {

        return convertDateTime(date, time, true);
    }

    /**
     * 生成日期To(yyyymmddhhmmss)
     *
     * @param date 日期To
     * @param time 时间To
     * @return yyyymmddhhmmss
     */
    public static String convertDateTimeTo(String date, String time) {

        return convertDateTime(date, time, false);
    }

    /**
     * 获取时间间隔(秒)
     *
     * @param fromDate 开始时间
     * @param toDate 结束时间
     * @return 时间间隔
     * @throws ParseException
     */
    public static Long getTimeInterval(String fromDate, String toDate) {

        if (CmnStringUtils.isBlank(fromDate) && CmnStringUtils.isBlank(toDate)){
            return 0L;
        }
        DateFormat df = new SimpleDateFormat(
            CmnDateUtil.DEFAULT_PRETTY_HOUR_MINUTE_MILLSEC_FORMAT);
        try{
            if (CmnStringUtils.isBlank(fromDate)
                || !CmnStringUtils.isBlank(toDate)){
                Date to = df.parse(toDate);
                return to.getTime();
            }
            if (!CmnStringUtils.isBlank(fromDate)
                || CmnStringUtils.isBlank(toDate)){
                Date from = df.parse(toDate);
                return 0 - from.getTime();
            }
            return df.parse(toDate).getTime() - df.parse(fromDate).getTime();
        }catch (ParseException e){
            return 0L;
        }
    }

    /**
     * 返回日期+000000
     *
     * @param date genFromDateTime
     * @return 日期+000000
     */
    public static String genFromDateTime(String date) {

        if (CmnStringUtils.isEmpty(date)){
            return CmnStringUtils.EMPTY;
        }
        return date + DEFAULT_TIME;
    }

    /**
     * 返回日期+235959
     *
     * @param date genFromDateTime
     * @return 日期+235959
     */
    public static String genFromDateTimeTo(String date) {

        if (CmnStringUtils.isEmpty(date)){
            return CmnStringUtils.EMPTY;
        }
        return date + DEFAULT_TIMETO;
    }

    /**
     * 获得当前时间
     *
     * @return 获得当前时间
     */
    public static final int getCurrTime() {

        Date d = new Date();
        String dstr = format(d, "HHmmss");
        return Integer.parseInt(dstr);
    }

    /**
     * YYYYMMDDHHMMSS to YYYYMMDDHHMM
     *
     * @param date Date
     * @return String
     */
    public static final String baseFormatDateTimeToYYYYMMDDHHMM(String date) {

        if (CmnStringUtils.isBlank(date)){
            return null;
        }
        SimpleDateFormat mydate = new SimpleDateFormat(
            DEFAULT_PRETTY_HOUR_MINUTE_FORMAT);
        DateFormat df = new SimpleDateFormat(
            DEFAULT_PRETTY_HOUR_MINUTE_MILLSEC_FORMAT);
        try{
            Date source = df.parse(date);
            return mydate.format(source);
        }catch (ParseException e){
            return null;
        }
    }

    /**
     * 计算日期之间的天数差
     *
     * @param beginDate (第一个日期：yyyyMMdd)
     * @param endDate (第二个日期：yyyyMMdd)
     * @return 相差天数
     */
    public static final int getDateApartCount(String beginDate, String endDate) {

        if (CmnStringUtils.isEmpty(endDate)){
            return Integer.MAX_VALUE;
        }else if (CmnStringUtils.isEmpty(endDate)){
            return Integer.MIN_VALUE;
        }
        Date fDate = parseDate(beginDate);
        Date oDate = parseDate(endDate);
        long diff = fDate.getTime() - oDate.getTime();
        int days = CmnNumberUtil
            .toInt(diff
                / (ONE_DAY_HOUR * ONE_HOUR_SECONDER * ONE_SECONDER_MINUTE * ONE_MINUTE_MILER));
        return days;

    }

    /**
     * 计算日期之间的时间差（精确分钟）
     *
     * @param beginDate (第一个日期：yyyyMMddHHmmss)
     * @param endDate (第二个日期：yyyyMMddHHmmss)
     * @return 相差天数
     */
    public static final int getMimuteApartCount(String beginDate, String endDate) {

        if (CmnStringUtils.isEmpty(beginDate)){
            return Integer.MAX_VALUE;
        }else if (CmnStringUtils.isEmpty(endDate)){
            return Integer.MIN_VALUE;
        }
        Date fDate = parseDate(beginDate);
        Date oDate = parseDate(endDate);
        long diff = fDate.getTime() - oDate.getTime();
        int days = CmnNumberUtil.toInt(diff
            / (ONE_SECONDER_MINUTE * ONE_MINUTE_MILER));
        return days;

    }

    /**
     * 获取年龄
     *
     * @param birthDay 生日
     * @return 年龄
     */
    public static final String calAge(String birthDay) {

        String t1 = getNowYYYYMMDD();
        String t2 = birthDay.replace('-', '/');

        Date dt1 = parseYYYYMMDD(t1);
        Date dt2 = parseYYYYMMDD(t2);
        long age = (dt1.getTime() - dt2.getTime())
            / (ONE_MINUTE_MILER * ONE_HOUR_SECONDER * ONE_SECONDER_MINUTE * ONE_DAY_HOUR)
            / ONE_YEAR_DAY;
        return CmnStringUtils.convertNull(age);
    }

    /**
     * 判断时间是否在指定期间中
     *
     * @param time 判断时间
     * @param fromTime 开始时间
     * @param toTime 结束时间
     * @return from < to ? true : false
     */
    public static boolean isTimeBetween(String time, String fromTime,
        String toTime) {

        if (CmnStringUtils.isEmpty(time) || CmnStringUtils.isEmpty(fromTime)
            || CmnStringUtils.isEmpty(toTime)){
            return false;
        }

        if (time.compareTo(fromTime) >= 0 && time.compareTo(toTime) <= 0){
            return true;
        }
        return false;

    }

    /**
     * 根据用户生日计算年龄
     */
    public static int getAgeByBirthday(String date, String dateFormat) {

        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        Date birthday;
        try{
            birthday = sdf.parse(date);
        }catch (ParseException e){
            return 0;
        }
        Calendar cal = Calendar.getInstance();

        int yearNow = cal.get(Calendar.YEAR);
        int monthNow = cal.get(Calendar.MONTH) + 1;
        int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH);

        cal.setTime(birthday);
        int yearBirth = cal.get(Calendar.YEAR);
        int monthBirth = cal.get(Calendar.MONTH) + 1;
        int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH);

        int age = yearNow - yearBirth;

        if (monthNow <= monthBirth){
            if (monthNow == monthBirth){
                if (dayOfMonthNow < dayOfMonthBirth){
                    age--;
                }
            }else{
                age--;
            }
        }
        return age;
    }

    /**
     * 取得当前日期所在月分的第一天、"yyyyMMdd"形式
     *
     * @param target 日期文字列
     * @return "yyyyMMdd"形式
     */
    public static String getMonthFirstDay(String target) {

        Calendar nowCalendar = Calendar.getInstance();
        nowCalendar.setTime(parseDate(target));
        nowCalendar.set(Calendar.DAY_OF_MONTH, 1);
        return formatYYYYMMDD(nowCalendar.getTime());
    }

    /**
     * 取得当前日期所在月分的最后一天、"yyyyMMdd"形式
     *
     * @param target 日期文字列
     * @return "yyyyMMdd"形式
     */
    public static String getMonthLastDay(String target) {

        Calendar nowCalendar = Calendar.getInstance();
        nowCalendar.setTime(parseDate(target));
        int lastDay = nowCalendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        nowCalendar.set(Calendar.DAY_OF_MONTH, lastDay);
        return formatYYYYMMDD(nowCalendar.getTime());
    }
    
    /**
     * 转换格式："YYYYMM"的文字列 -> "YYYY/MM"
     *
     * @param target 日期对象
     * @return 转换后文字列
     */
    public static String formatYYYYMM(String target) {
        if(CmnStringUtils.isEmpty(target)){
            return CmnStringUtils.EMPTY;
        }
        try{
        SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_YEAR_MONTH);
        Date date = sdf.parse(target);
        SimpleDateFormat sdf1 = new SimpleDateFormat(DEFAULT_PRETTY_YEAR_MONTH);
        return sdf1.format(date);
        }catch (ParseException e){
            return CmnStringUtils.EMPTY;
        }
    }
    
    /**
     * 转换格式："yyyy/MM/dd HH:mm:ss"的文字列 -> "yyyyMMddHHmmss"
     *
     * @param target 日期对象
     * @return 转换后文字列
     */
    public static String formatTime(String target) {
        if(CmnStringUtils.isEmpty(target)){
            return CmnStringUtils.EMPTY;
        }
        try{
        	String returnStr = target.replace(" ", "").replace("/", "").replace(":", "");
        return returnStr;
        }catch (Exception e){
            return CmnStringUtils.EMPTY;
        }
    }
    
}
